/**
 * 分块序列化任意数据为 JSON 字符串
 * @param data 要序列化的数据（对象、数组或基本类型）
 * @param chunkSize 分块大小（默认1000个属性/元素）
 * @returns Promise<string> 解析为 JSON 字符串的 Promise
 */
async function chunkedStringify<T>(data: T, chunkSize: number = 1000): Promise<string> {
    // 处理 null 或 undefined
    if (data === null || data === undefined) {
        return JSON.stringify(data);
    }

    // 处理基本类型（string, number, boolean）
    if (typeof data !== 'object') {
        return JSON.stringify(data);
    }

    // 处理数组
    if (Array.isArray(data)) {
        let result = '[';
        for (let i = 0; i < data.length; i++) {
            const chunk = await chunkedStringify(data[i], chunkSize);
            result += (i === 0 ? '' : ',') + chunk;

            // 定期释放事件循环
            if (i % chunkSize === 0) {
                await new Promise(resolve => setImmediate(resolve));
            }
        }
        return result + ']';
    }

    // 处理普通对象
    const keys = Object.keys(data);
    let result = '{';

    for (let i = 0; i < keys.length; i++) {
        const key = keys[i];
        const value = (data as Record<string, unknown>)[key];
        const serializedValue = await chunkedStringify(value, chunkSize);

        result += (i === 0 ? '' : ',') + `"${key}":${serializedValue}`;

        // 定期释放事件循环
        if (i % chunkSize === 0) {
            await new Promise(resolve => setImmediate(resolve));
        }
    }

    return result + '}';
}

export default chunkedStringify;